로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
10 사용자 인증(Authentication) | ✅ 편저: 코담 운영자
Django 튜토리얼 #10 - 사용자 인증(Authentication)
🔗 소스
1. 강의 목표
- Django의 인증 시스템을 활용하여 회원가입, 로그인, 로그아웃 기능을 구현한다.
- 인증된 사용자만 접근 가능한 페이지를 보호하는 방법을 학습한다.
LoginRequiredMixin
,@login_required
,authenticate
,login
,logout
등 핵심 기능을 익힌다.
2. 기본 설정
django.contrib.auth
,django.contrib.sessions
등 인증 관련 앱은 Django에서 기본으로 설정되어 있음settings.py
에 사용자 앱 등록 (INSTALLED_APPS
에'auth_app'
추가)- 정적 파일 경로 지정 (예:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
)
3. 폼 클래스 정의 (authApp/forms.py)
사용자 회원가입에 사용할 폼 클래스를 정의하는 파일입니다.
User
모델을 기반으로 비밀번호 확인 필드를 추가하고, 검증 로직을 포함합니다.
from django import forms
from django.contrib.auth.models import User
# 사용자 회원가입 폼 정의
class RegisterForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput) # 비밀번호 입력 필드
password_confirm = forms.CharField(widget=forms.PasswordInput, label="비밀번호 확인") # 비밀번호 확인 입력 필드
class Meta:
model = User
fields = ['username', 'password', 'password_confirm']
# 비밀번호 일치 여부 검증
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get('password')
password_confirm = cleaned_data.get('password_confirm')
if password and password_confirm and password != password_confirm:
raise forms.ValidationError("비밀번호가 일치하지 않습니다!")
return cleaned_data
4. 뷰 함수 및 클래스 (authApp/views.py)
사용자 요청에 따라 회원가입, 로그인, 로그아웃, 인증된 사용자 전용 페이지를 처리하는 함수 및 클래스 기반 뷰를 정의합니다.
- 주요 import:
from django.shortcuts import render, redirect # 템플릿 렌더링 및 리디렉션
from django.contrib.auth import authenticate, login, logout # 인증 관련 함수
from django.contrib.auth.mixins import LoginRequiredMixin # 클래스 기반 뷰 보호
from django.contrib.auth.decorators import login_required # 함수 기반 뷰 보호
from django.contrib.auth.models import User # 기본 사용자 모델
from django.views import View # 클래스 기반 뷰
from .forms import RegisterForm # 회원가입 폼
```python
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.views import View
from .forms import RegisterForm
회원가입 뷰
def register_view(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = User.objects.create_user(username=username, password=password)
login(request, user)
return redirect('home')
else:
form = RegisterForm()
return render(request, 'accounts/register.html', {'form': form})
로그인 뷰
def login_view(request):
error_message = ''
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user:
login(request, user)
next_url = request.POST.get('next') or request.GET.get('next') or 'home'
return redirect(next_url)
else:
error_message = 'Invalid credentials'
return render(request, 'accounts/login.html', {'error': error_message})
로그아웃 뷰
def logout_view(request):
if request.method == 'POST':
logout(request)
return redirect('login')
return redirect('home')
로그인 필수 홈 뷰
from django.contrib.auth.decorators import login_required
@login_required
def home_view(request):
return render(request, 'home/home.html')
로그인 필수 클래스 기반 뷰 (Protected)
class ProtectedView(LoginRequiredMixin, View):
login_url = 'login'
redirect_field_name = 'next'
def get(self, request):
return render(request, 'registration/protected.html')
5. 디렉토리 및 템플릿 구조 (authApp/templates/ 하위 구조)
템플릿 파일은 로그인/회원가입 등 인증 관련 UI를 담당하며, 각각의 기능별 디렉토리에 나뉘어 관리됩니다.
lesson10-Authentication/
├── authProject/
│ ├── authApp/
│ │ ├── static/
│ │ │ └── styles/
│ │ │ └── styles.css
│ │ ├── templates/
│ │ │ ├── accounts/
│ │ │ │ ├── login.html
│ │ │ │ ├── logout.html
│ │ │ │ └── register.html
│ │ │ ├── auth1_app/
│ │ │ │ └── home.html
│ │ │ └── registration/
│ │ │ └── protected.html
│ │ ├── forms.py
│ │ ├── views.py 등...
│ ├── authProject/
│ │ ├── settings.py 등...
│ └── manage.py
-
{% load static %}
선언 필수 -
모든 폼에는
{% csrf_token %}
삽입 필요 -
{% load static %}
선언 필수 -
각 템플릿에서
{% csrf_token %}
사용
6. settings.py 추가 설정 (authProject/settings.py)
로그인 성공 후 리디렉션될 기본 URL을 지정합니다.
LOGIN_REDIRECT_URL = 'home'
- 로그인 후 기본 리디렉션 URL 지정
7. URL 연결 (authProject/urls.py, authApp/urls.py)
프로젝트와 앱 레벨에서 각각 URL 패턴을 정의하여 뷰와 연결합니다.
프로젝트 urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('auth_app.urls')),
]
앱 urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home_view, name='home'),
path('login/', views.login_view, name='login'),
path('logout/', views.logout_view, name='logout'),
path('register/', views.register_view, name='register'),
path('protected/', views.ProtectedView.as_view(), name='protected'),
]
8. 실습 요약
RegisterForm
을 통해 사용자 생성 시 비밀번호 확인 기능 구현- 로그인 시
authenticate()
로 사용자 검증 후login()
처리 - 로그아웃 시
logout()
호출하여 세션 종료 LoginRequiredMixin
또는@login_required
로 보호 페이지 구성
다음 강의 예고
- 실제 프로젝트에 인증 시스템 통합 및 Bootstrap 스타일링 적용